package com.season.design_pattern.singleton;

import com.season.design_pattern.util.ThreadUtil;

/**
 * lazy loading 懒汉式
 * 虽然达到了按需初始化的目的，但是带来了线程不安全的问题
 * 可以通过synchronized解决，但是带来了效率下降
 * synchronized  https://zhuanlan.zhihu.com/p/453571682
 */
public class Mgr04 {
    private static Mgr04 INSTANCE;

    private Mgr04() {}

    /**
     * 锁定了Mgr04 class
     * @return
     */
    public static synchronized Mgr04 getInstance() {
        if (INSTANCE == null) {
            ThreadUtil.sleep(1); // 睡眠 1ms
            INSTANCE = new Mgr04();
        }
        return INSTANCE;
    }

    // lambda,是对只有一个方法的匿名内部类的简写
    public static void main(String[] args) {
        for (int i = 0; i < 100; i++) {
            new Thread(() -> {System.out.println("Mgr04.getInstance().hashCode() = " + Mgr04.getInstance().hashCode());}
            ).start();
        }
    }
}
